DTS
1 | backlight: backlight { |
1 | pwms = <&pwm0 0 25000 0>; |
第一个参数 表示此背光接在 pwm0 上;
第二个参数 表示 index 为 0,pwm0 下只有 1个 pwm,所以填 0
第三个参数 表示周期为 25000ns,即 频率 为 40k
第四个参数 表示极性,0 正极性,1 负极性
正极性 0 表示 背光为正极 0~255 ,占空比从 0~100% 变化
负极性 1 表示 背光为负极 255~0 ,占空比从 100~0% 变化
1 | default-brightness-level = <50> |
表示默认的背光,它存在于开机时候背光初始化到安卓
设置下来新的背光这段时间, default-brightness-level = < 50 > 表示为第 50 个元素的背光亮度
1 | enable-gpios |
表示背光使能脚,这个根据电路原理图配置即可;
有的硬件没有这个背光使能脚,那么将这个配置删除,背光驱动通过配置 brightness-levels 数组的第 0 个元素将显示调黑
驱动分析
kernel/drivers/video/backlight/pwm_bl.c
1 | pwm_backlight_probe |
计算占空比:
compute_duty_cycle:
1 | static int compute_duty_cycle(struct pwm_bl_data *pb, int brightness) |
KrisFei 的小结:
其实不管用哪种方式都是调用backlight_update_status来改变背光,syfs也是,看下backlight.c
backlight_class_init -> backlight.c
class_create //创建class,名字是backlight.
backlight_class->dev_attrs = bl_device_attributes;
1 | static struct device_attribute bl_device_attributes[] = { |
其中backlight_store_brightness() 最终调用backlight_update_status().
还有一种情况是亮屏/灭屏时调用,记得前面有注册一个fb notify callback.
1 | static int fb_notifier_callback(struct notifier_block *self, |
可以看到最后也是调用backlight_update_status()
问题集锦
占空比到 20% 就黑了,到 80% 就满了
有时候屏 pwm 占空比到 20% 就灭了,到 80% 就很亮了,即 brightness-levels 到 50 就灭了,到 200 就足够亮了。
此时不需要 0~49 和 201 ~ 255
所以我们 brightness-levels 数组的时候可以均匀的重复某些值。
比如
brightness-levels = <
255 50 51 51 52 53 53 54
54 55 56 56 57 57 58 59
59 60 60 61 62 62 63 63
… 198 199 199 200>
参考文章:
[1] KrisFei http://blog.csdn.net/kris_fei/article/details/52485635